package com.seoultour.joel;

import com.seoultour.joel.hadoop.HDFSBeanFactory;
import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@Service
public class Registry extends HDFSBeanFactory.Support {

	private final Logger logger = LoggerFactory.getLogger(this.getClass());

	private List<String> tweets = new ArrayList<String>();

	private String escape(String str) {
		StringBuilder sb = new StringBuilder(str.length() * 2);
		for (int i = 0; i < str.length(); ++i) {
			char ch = str.charAt(i);
			switch(ch) {
				case '\b':
					sb.append("\\b");
					break;
				case '\n':
					sb.append("\\n");
					break;
				case '\t':
					sb.append("\\t");
					break;
				case '\f':
					sb.append("\\f");
					break;
				case '\r':
					sb.append("\\r");
					break;
				default :
					sb.append(ch);
			}
		}

		return sb.toString();
	}

	public void save(String tweet) {
		System.out.println("catch: " + escape(tweet));
		tweets.add(escape(tweet));
		if (tweets.size() == 100) {
			File file = new File("/tmp/tour");
			file.mkdirs();

			int maxnum = 0;
			for (String filename : file.list()) {
				int num = Integer.parseInt(filename.substring(0, filename.indexOf('.')));
				if (num > maxnum)
					maxnum = num;
			}

			file = new File(file, maxnum + ".txt");
			try {
				FileUtils.writeLines(file, tweets);
			} catch (IOException e) {
				logger.error(e.getMessage(), e);
			}
		}
	}

//	public void save(String tweet) {
//		FileSystem fs = getFileSystem();
//		tweets.add(tweet);
//		try {
//			if (tweets.size() == 100) {
//				Path dirPath = new Path("/tmp/tour");
//				if (!fs.exists(dirPath)) {
//					fs.mkdirs(dirPath);
//				}
//
//				int maxnum = 0;
//				for (FileStatus fileStatus : fs.globStatus(new Path("/tmp/tour/*.txt"))) {
//					String filename = fileStatus.getPath().getName();
//					int num = Integer.parseInt(filename.substring(0, filename.indexOf('.')));
//					if (num > maxnum)
//						maxnum = num;
//				}
//
//				FSDataOutputStream os = null;
//				try {
//					os = fs.create(new Path("/tmp/tour/" + maxnum + ".txt"));
//					for (String t : tweets) {
//						os.writeUTF(StringEscapeUtils.escapeJava(t) + "\n");
//					}
//					os.flush();
//				} finally {
//					if (os != null)
//						os.close();
//				}
//			}
//		} catch (IOException e) {
//			logger.error(e.getMessage(), e);
//		}
//	}

	@Override
	public String toString() {
		return "Registry{" +
				"tweets=" + tweets +
				'}';
	}
}
